#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int sig)
{
    pid_t id;
    while ((id = waitpid(-1, NULL, WNOHANG)) > 0)
    {
        printf("wait child success: %d\n", id);
    }
    printf("child is quit! %d\n", getpid());
}
int main()
{
    // signal(SIGCHLD,SIG_IGN);  // 在Linux中可用，在其他unix中不一定可用
    signal(SIGCHLD, handler);
    pid_t cid;
    if ((cid = fork()) == 0)
    { // child
        printf("child : %d\n", getpid());
        sleep(3);
        exit(1);
    }
    while (1)
    {
        printf("father proc is doing some thing!\n");
        sleep(1);
    }
    return 0;
}

// volatile int flag = 0;  // volatile 作⽤：保持内存的可⻅性，告知编译器，被该关键字修饰的变量，不允许被优化，对该变量的任何操作，都必须在真实的内存中进⾏操作
// void handler(int sig)
// {
//     printf("chage flag 0 to 1\n");
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);
//     while (!flag)
//         ;
//     printf("process quit normal\n");
//     return 0;
// }